from langchain.chat_models.gigachat import GigaChat
from config import gigaChatCredentials

llm = GigaChat(credentials=gigaChatCredentials, scope='GIGACHAT_API_CORP', verify_ssl_certs=False)

from langchain.schema import HumanMessage

doLog = True

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

local_states = {} # На каком шаге находится пользователь
INIT, WORK_NAME, PLACE, PUBLISHER, YEAR, PAGES = range(6)

user_data = {} # Данные, которые ввел пользователь

def set_state(chatId, state):
    local_states[chatId] = state

def bibliography(bot, chatId, mes):
    state = local_states.get(chatId)
    if mes == None:
        set_state(chatId, None)
        state = None
    if state == None:
        bot.send_message(chatId, "Ответьте на несколько вопросов и я оформлю вам библиографическую ссылку.")
        bot.send_message(chatId, "ФИО авторов[1/6]: ")
        set_state(chatId, INIT)
    if state == INIT:
        fio = mes
        fioQuestion = f'Это похоже на ФИО? {fio} Ответь строго Да или Нет'
        if doLog:
            print(fioQuestion)
        fioResp = llm([HumanMessage(content=fioQuestion)]).content
        if doLog:
            print(fioResp)
        if fioResp == 'Да':
            user_data[chatId] = {"fio": fio}
            set_state(chatId, WORK_NAME)
            bot.send_message(chatId, "Название работы:[2/6]: ")
            return
        # TODO: Если это список авторов и авторов больше 4 - оформление надо чуть по другому сделать
        listQuestion = f'Это является списком фамилий? {fio}. Ответь строго Да или Нет'
        if doLog:
            print(listQuestion)
        listResp = llm([HumanMessage(content=listQuestion)]).content
        if doLog:
            print(listResp)
        if listResp == 'Да':
            user_data[chatId] = {"fio": fio}
            set_state(chatId, WORK_NAME)
            bot.send_message(chatId, "Название работы[2/6]: ")
            return
        bot.send_message(chatId, 'Это не похоже на ФИО авторов. Измените ввод')
    if state == WORK_NAME:
        workName = mes #input("Название работы: ")
        workNameQuestion = f'Это похоже на название статьи или книги? {workName}. Ответь строго Да или Нет'
        if doLog:
            print(workNameQuestion)
        workNameResp = llm([HumanMessage(content=workNameQuestion)]).content
        if doLog:
            print(workNameResp)
        if workNameResp == 'Да':
            user_data[chatId]["workName"] = workName
            set_state(chatId, PLACE)
            bot.send_message(chatId, "Место издания[3/6]: ")
            return
        bot.send_message(chatId, 'Это не похоже на Название работы. Измените ввод')
    if state == PLACE:
        place = mes
        placeQuestion = f'Это похоже на название города или населенного пункта? {place}. Ответь строго Да или Нет'
        if doLog:
            print(placeQuestion)
        placeResp = llm([HumanMessage(content=placeQuestion)]).content
        if doLog:
            print(placeResp)
        if placeResp == 'Да':
            user_data[chatId]["place"] = place
            set_state(chatId, PUBLISHER)
            bot.send_message(chatId, "Издательство[4/6]: ")
            return
        bot.send_message(chatId, 'Это не похоже на Место издания. Должно быть название города или населенного пункта. Измените ввод')
    if state == PUBLISHER:
        publisher = mes
        publisherQuestion = f'Это похоже на название Издательства? {publisher}. Ответь строго Да или Нет'
        if doLog:
            print(publisherQuestion)
        publisherResp = llm([HumanMessage(content=publisherQuestion)]).content
        if doLog:
            print(publisherResp)
        if publisherResp == 'Да':
            user_data[chatId]["publisher"] = publisher
            set_state(chatId, YEAR)
            bot.send_message(chatId, "Год издания[5/6]: ")
            return
        bot.send_message(chatId, 'Это не похоже на Издательство. Измените ввод')
    if state == YEAR:
        year = mes
        yearQuestion = f'Является ли это годом? {year}. Ответь строго Да или Нет'
        if doLog:
            print(yearQuestion)
        yearResp = llm([HumanMessage(content=yearQuestion)]).content
        if doLog:
            print(yearResp)
        if yearResp == 'Да':
            user_data[chatId]["year"] = year
            set_state(chatId, PAGES)
            bot.send_message(chatId, "Количество страниц[6/6]: ")
            return
        bot.send_message(chatId, 'Это не похоже на Год. Измените ввод')
    if state == PAGES:
        pages = mes
        pagesQuestion = f'Это похоже на целое положительное число? {pages}. Ответь строго Да или Нет'
        if doLog:
            print(pagesQuestion)
        pagesResp = llm([HumanMessage(content=pagesQuestion)]).content
        if doLog:
            print(pagesResp)
        if pagesResp == 'Да':
            user_data[chatId]["pages"] = pages
            doGenerate(bot, chatId)
            return
        bot.send_message(chatId, 'Это не похоже на Количество страниц. Должно быть целое положительное число. Измените ввод')



def doGenerate(bot, chatId):
    fio = user_data[chatId]["fio"]
    workName = user_data[chatId]["workName"]
    place = user_data[chatId]["place"]
    publisher = user_data[chatId]["publisher"]
    year = user_data[chatId]["year"]
    pages = user_data[chatId]["pages"]
    question = f'Оформи ссылку согласно ГОСТ Р 7.0.5–2008. ФИО Авторов: {fio}. Название работы: {workName}. Место издания: {place}. Издательство: {publisher}. Год издания: {year}. Количество страниц: {pages}.'
    if doLog:
        print(question)
    resp = llm([HumanMessage(content=question)]).content
    if doLog:
        print(resp)
    bot.send_message(chatId, resp)
    set_state(chatId, None)